<?php

/**
 * Obiekt reprezentujący plik żądania
 *
 */
class Rapide_Request_Plugin_Files_File
{
	private $_aFile;

	/**
	 * Konstruuje obiekt przy pomocy tablicy z informacjami o pliku
	 *
	 * @param array $aFile
	 */
	public function __construct(array $aFile)
	{
		$this->_aFile = $aFile;
	}

	/**
	 * Sprawdza, czy przesłany plik zawiera błędy
	 *
	 * @return bool
	 */
	public function hasErrors()
	{
		return !($this->_aFile['error'] === UPLOAD_ERR_OK);
	}

	/**
	 * Zwraca numer błędu
	 *
	 * @return int
	 */
	public function getError()
	{
		return $this->_aFile['error'];
	}

	/**
	 * Zwraca nazwę pliku
	 *
	 * @return string
	 */
	public function getName()
	{
		return $this->_aFile['name'];
	}

	/**
	 * Zwraca nazwę pliku tymczasowego zawierającego dane
	 *
	 * @return string
	 */
	public function getTmpName()
	{
		return $this->_aFile['tmp_name'];
	}

	/**
	 * Zwraca rozmiar pliku
	 *
	 * @return int
	 */
	public function getSize()
	{
		return $this->_aFile['size'];
	}

	/**
	 * Zwraca typ mime pliku
	 *
	 * Należy pamiętać, że jest to typ przekazany w nagłówkach żądania i może
	 * różnić się od rzeczywistego
	 * 
	 * @return string
	 */
	public function getType()
	{
		return $this->_aFile['type'];
	}

	/**
	 * Przenosi plik do wskazanej lokalizacji
	 *
	 * @param string $sDestination ścieżka do docelowego pliku
	 * @param bool $bOverwrite określa, czy nadpisać istniejący plik
	 * @throws Rapide_Request_Plugin_Files_File_Exception jeżeli nie ma praw zapisu do wskazanej lokalizacji
	 * @throws Rapide_Request_Plugin_Files_File_Exception jeżeli plik docelowy istnieje i wyłączono nadpisywanie plików
	 * @throws Rapide_Request_Plugin_Files_File_Exception jeżeli nie można zapisać pliku z innych przeczyn
	 */
	public function move($sDestination, $bOverwrite = true)
	{
		$sDir = dirname($sDestination);

		if(!is_writable($sDir))
		{
			$sError = sprintf('Directory %s is not writable', $sDir);
			throw new Rapide_Request_Plugin_Files_File_Exception($sError);
		}

		$sDestination = $sDir . '/' . basename($sDestination);

		if(!$bOverwrite && file_exists($sDestination))
		{
			$sError = sprintf('File %s exists and can not be overwritten', $sDestination);
			throw new Rapide_Request_Plugin_Files_File_Exception($sError);
		}

		if(!move_uploaded_file($this->getTmpName(), $sDestination))
		{
			$sError = sprintf('Can not save file %s', $sDestination);
			throw new Rapide_Request_Plugin_Files_File_Exception($sError);
		}
	}
}

?>